from  rest_framework import serializers


#继承原有models进行校验
from users.models import User
#调用用户绑定数据进行调查看看是否存在
from .models import  OAuthQQUser
#调用redis进行判断绑定时用户输入的参数是否正确
from django_redis import get_redis_connection
#调用自己编写的解密器进行解密验证
from .utils import check_open_id
"""
    用户点击绑定按钮的时候,前端应该将 手机号,密码,openid,sms_code 发送给后端
    2. 对数据进行校验
        2.1 校验 openid 和sms_code
        2.2 判断手机号
            如果注册过,需要判断 密码是否正确
            如果没有注册过,创建用户
    3. 保存数据
        3.1保存 user 和 openid
"""
# serializers.ModelSerializer
# serializers.Serializer
#  serializers.ModelSerializer 并没有优势 应为要判断的字段并不在模型中


class OauthQQUserSerializer(serializers.Serializer):
    #要校验的字段
    #(当时传的是access_token)
    access_token = serializers.CharField(label='操作凭证openid')
    mobile = serializers.RegexField(label='手机号', regex=r'^1[3-9]\d{9}$')
    password = serializers.CharField(label='密码',max_length=20,min_length=8)
    #手机验证短息
    sms_code =serializers.CharField(label='短信验证码')

    #多字段校验方法
    def validate(self, attrs):
        #1.1 校验opend   其中check_openid_id是自己编写的校验方法
        openid = check_open_id(attrs.get('access_token'))
        if openid is None:
            raise serializers.ValidationError('access_token错误')

        attrs['openid']=openid

        #1.2sms_code 校验短信验证码
        #获取参数
        sms_code = attrs.get('sms_code')
        #链接redis
        redis_conn = get_redis_connection('code')
        #获取redis中的短信验证码
        redis_code = redis_conn.get('sms_%s'%attrs['mobile'])
        #产看是否过期
        if redis_code is None:
            raise serializers.ValidationError('短信验证码已过期')
        #没过期查看是否一直 数据库存的是二进制 别忘记解码
        if redis_code.decode() != sms_code:
            raise serializers.ValidationError('验证码不一致')


        #判断手机号
        mobile = attrs.get('mobile')
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            pass #哦在这停顿   这位用户没有注册过啦

        else:
            #如果注册过则需要判断密码是否正确
            if not user.check_password(attrs['password']):
                raise serializers.ValidationError('密码不正确')

            attrs['user'] = user

        return attrs






        #     如果没有注册过,创建用户
        # 我们把创建用户的代码写在这里 也行
        #创建用户 data-->attrs-->validated_data
    def create(self, validated_data):
        '''
        所有所有的目的都为最终保存user和openid
        '''

        user = validated_data.get('user')
        openid = validated_data.get('openid')
        #创建用户
        if user is None:
            user = User.objects.create(
                username = validated_data.get('mobile'),
                mobile = validated_data.get('mobile'),
                password = validated_data.get('password')
            )


            #对密码进行加密处理
            user.set_password(validated_data.get('password'))
            user.save()

            qquser = OAuthQQUser.objects.create(
                user = user,
                openid = openid

            )

            return qquser